﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Service.Data;
using System.Data.Common;
using Sinacor.Infra.Service.Common;
using System.Data;

namespace Sinacor.OMM.Deployment.Configurator.ResourceAccess
{
    public class HealthMonitor : BaseResourceAccess
    {

        #region Constructor

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="companyId"></param>
        public HealthMonitor(Int32 companyId)
            : base(companyId)
        {

        }

        #endregion

        #region Methods

        public Entity.HealthMonitor ConsultarMonitor()
        {
            //
            String sqlCommand = String.Empty;
            Entity.HealthMonitor retorno = null;

            sqlCommand = @"SELECT a.TEM_INTV_ATLZ_MONI
                                  ,a.TEM_INTV_NOVO_TENT_CONX
                                  ,a.NOME_DRTO_LOG_FOTO
                                  ,a.NOME_ARQ_LOG_FOTO
                                  ,a.NUM_PRTA_TCP
                                  ,a.NOME_SERD_TCP
                                  ,a.NOME_DRTO_LOG_PROS_SERD
                                  ,a.COD_REPRIO_MSG
                                  ,(SELECT TXT_CNTD_PRDD FROM TBOREPRIO_DET WHERE NOME_PRDD = 'CONNECTION_STRING' AND COD_REPRIO = a.COD_REPRIO_MSG) DESC_REPRIO_MSG
                                  ,(SELECT TXT_CNTD_PRDD FROM TBOREPRIO_DET WHERE NOME_PRDD = 'QUEUE_MESSAGE_LIMIT' AND COD_REPRIO = a.COD_REPRIO_MSG) MSG_LIMIT_REPRIO_MSG
                                  ,(SELECT TXT_CNTD_PRDD FROM TBOREPRIO_DET WHERE NOME_PRDD = 'QUEUE_BYTES_LIMIT' AND COD_REPRIO = a.COD_REPRIO_MSG) BYTES_LIMIT_REPRIO_MSG
                           FROM TBOCNFG_MONC_SIST a";

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sqlCommand))
            {
                retorno = this.FindOne<Entity.HealthMonitor>(command,
                    reader =>
                    {
                        Entity.HealthMonitor item = new Entity.HealthMonitor();

                        item.TimeStampAtualizacao = reader.GetValue<int>("TEM_INTV_ATLZ_MONI");
                        item.TimeStampTentativaConexao = reader.GetValue<int>("TEM_INTV_NOVO_TENT_CONX");
                        item.DiretorioLog = reader.GetValue<String>("NOME_DRTO_LOG_FOTO");
                        item.ArquivoLog = reader.GetValue<String>("NOME_ARQ_LOG_FOTO");
                        item.PortaTCP = reader.GetValue<int>("NUM_PRTA_TCP");
                        item.ServidorTCP = reader.GetValue<String>("NOME_SERD_TCP");
                        item.DiretorioLogServidor = reader.GetValue<String>("NOME_DRTO_LOG_PROS_SERD");
                        item.Repositorio.Codigo = reader.GetValue<int>("COD_REPRIO_MSG");
                        item.Repositorio.Fila = reader.GetValue<String>("DESC_REPRIO_MSG");
                        item.Repositorio.LimiteMensagem = reader.GetValue<int>("MSG_LIMIT_REPRIO_MSG");
                        item.Repositorio.LimiteTamanho = reader.GetValue<int>("BYTES_LIMIT_REPRIO_MSG");

                        return item;
                    });
            }

            return retorno;
        }

        public void AlterarMonitor(Entity.HealthMonitor entity)
        {
            String sqlCommand = String.Empty;

            sqlCommand = @"UPDATE TBOCNFG_MONC_SIST SET
                                   TEM_INTV_ATLZ_MONI       = :TEM_INTV_ATLZ_MONI
                                  ,TEM_INTV_NOVO_TENT_CONX  = :TEM_INTV_NOVO_TENT_CONX
                                  ,NOME_DRTO_LOG_FOTO       = UPPER(:NOME_DRTO_LOG_FOTO)
                                  ,NOME_ARQ_LOG_FOTO        = UPPER(:NOME_ARQ_LOG_FOTO)
                                  ,NUM_PRTA_TCP             = :NUM_PRTA_TCP
                                  ,NOME_SERD_TCP            = UPPER(:NOME_SERD_TCP)
                                  ,NOME_DRTO_LOG_PROS_SERD  = UPPER(:NOME_DRTO_LOG_PROS_SERD)";

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sqlCommand))
            {
                this.DataBase.AddInParameter(command, "TEM_INTV_ATLZ_MONI", DbType.Int32, entity.TimeStampAtualizacao);
                this.DataBase.AddInParameter(command, "TEM_INTV_NOVO_TENT_CONX", DbType.Int32, entity.TimeStampTentativaConexao);
                this.DataBase.AddInParameter(command, "NOME_DRTO_LOG_FOTO", DbType.String, entity.DiretorioLog);
                this.DataBase.AddInParameter(command, "NOME_ARQ_LOG_FOTO", DbType.String, entity.ArquivoLog);
                this.DataBase.AddInParameter(command, "NUM_PRTA_TCP", DbType.Int32, entity.PortaTCP);
                this.DataBase.AddInParameter(command, "NOME_SERD_TCP", DbType.String, entity.ServidorTCP);
                this.DataBase.AddInParameter(command, "NOME_DRTO_LOG_PROS_SERD", DbType.String, entity.DiretorioLogServidor);

                this.DataBase.ExecuteNonQuery(command);
            }
        }

        #endregion
    }
}